1 什么是构造系统
- 对编译型语言进行编译(比如 c、c++)
- 对解释型语言进行打包和编译(比如 perl、python)
- 对 web 应用进行编译和打包(JSP、ASP、PHP、Vue、AngularJS、ReactJS)
- 执行单元测试
- 静态分析
- 生成 PDF 或 HTML 文档
- …
1.1 编译型语言
版本控制工具
:CVS、SVN、Git
源树和目标树
:指某个特定开发人员处理的源文件集合和编译后的目标文件集合。编译工具
:c、java的编译器、文档生成器、单元测试生成器构造机器
:指计算机设备,编译工具在这些机器上执行发布打包和目标机器
:软件打包、分发给最终用户、在目标机器安装的方法。
编译型语言的传统构造系统示意图
1.2 解释型语言
解释型语言的源代码不用编译成目标代码,因此无须目标树。
解释型语言的构造系统示意图
1.3 web应用
用于 web 应用的构造系统是一种混合体,包含编译型代码、解释型代码以及配置文件和数据文件。
- 静态 HTML 文件
- JSP、ASP、PHP 页面
- Java 源文件
web 应用软件的构造系统示意图
1.4 单元测试
事实上,单元测试构造系统只是标准构造系统的变体。这种构造系统不生成可在目标机器上安装的发布包,而是生成许多更小的单元测试包。
生成单元测试包的构造系统示意图
1.5 静态分析
与常规构造系统类似,静态分析系统的输入也是同样是源代码。不过,它不生成 目标树
和 发布包
,而是输出某种类型的缺陷报告文档。
用于静态分析的构造系统示意图
1.6 文档生成
该构造系统的输出是 PDF 文件,或是 HTML 页面和图形图像的集合,或是任何其他可视为文档的东西。
生成文档的构造系统示意图
2 构造系统的各个组成部分
2.1 版本控制工具
- 获取源代码拷贝
- 检入、提交
- 多重代码流
- 查阅老版本
2.2 源树与目标树
说明
源树
:程序源文件的目录结构
目标树
: 目标文件的目录结构
价值:
- 可读性
- 源代码控制
- 性能
2.3 编译工具和构造工具
构造工具 -> 编译工具 -> 编译器
编译器
:一般用来把高级编程语言代码转译成目标代码。编译工具
:指任何可以输入数据转换成输出数据的工具。构造工具
:所处的层面比编译工具更高,会调用必要的编译工具,来生成最终的构造输出结果。
常见编译工具
- c 编译器
- 链接器
- UML 代码生成器
- 文档生成器
- 用于创建目录的命令行工具
- …
2.4 构造机器
- 原生编译(native compilation):软件的
构造
和运行
,在同类的机器上。
- 跨平台编译(cross-compilation):软件的
构造
和运行
,是分别在不同操作系统或不同 cpu 的两类机器上进行的。
2.5 发布打包与目标机器
直接把一堆可执行程序和数据文件交给用户,指望他们能够自行安装和配置,这种想法是不现实的。
特点
- 单个文件
- 进行压缩,以减少下载时间
- 把不相干的调试信息去掉
常见打包和安装
- 归档文件
- 打包管理工具(.rpm、.deb 等)
- 定制的图形用户界面(GUI)安装工具
3 构造过程和构造描述
构造过程
构造工具调用各个编译工具来完成一连串事件,这个过程就是所谓的构造过程
(build process)。
面向编译型语言的构造系统示意图
构造描述
对构造工具来说,需要以文本格式编写构造描述
(build description)。
以 SCons 的构造描述文件为例
1 | Progam("stock", ["ticker.c", "currency.c"]) |
4 如何使用构造系统
根据构造的频度
和构造的程序的用途
,可以分三种使用场景:
开发人员(或本地)构造
:每次对代码进行修改后对软件进行增量式的重新编译,生成的发布包仅用于开发人员本地调试。
发布构造
:软件开发到测试阶段,向测试小组提供的完整的团建包,经过测试确信没有质量问题后就提交给客户。健全性构造
:用来判断当前源码是否 “健全”,能够正确无误地进行构造。每天可以进行过次,一般是全自动进行的。许多开发人员使用每日构造(daily build)
或每夜构造
来描述这种场景。
构造管理工具
说明:构造管理工具是在现有构造系统之上的另一个管理层,而不是构造系统本身,好的构造管理工具应当提供以下特性:
- 根据预先确定的计划安排,或在新代码提交后,检出源树并进行构造。
- 提供一套排队机制,让多个构造任务可以共享构造机器资源池,当有足够数量的可用机器时,即启动下一个构造任务。
- 在构造开始、完成、成功或失败时,向各种群组的用户发送电子邮件通知信息。
- 提供一套图形用户界面,显示构造何时开始、是否成功或失败等状态。
- 对版本号进行管理,在每次构造成功后递增版本号的值。
- 在归档目录中存档可供测试人员使用的最终软件包。
- 在构造成功之后启动及健全性检测。
- 能够识别开发人员黑名单,即最近检入错误代码的开发人员的名单。
举例
- Build Forge
- ElectricCommander
- CruiseControl
- Hudson
- jenkins
- …
5 构造软件的质量
好的构造系统应当具备以下特征:
- 易用性
- 正确性
- 性能
- 可伸缩性